package com.stardata.liangshisq.tcslmon.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.stardata.liangshisq.tcslmon.entity.KcKsc;
import com.stardata.liangshisq.tcslmon.entity.ProductVo;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author Samson Shu
 * @email shush@stardata.top
 * @date 2020/8/8 20:20
 */

public interface KcKscService  extends IService<KcKsc> {
  /**
   * 查询所有后厨待完成的订单ID列表
   * @param shopId 指定的店铺ID
   * @param status 订单状态，1：待配菜；2：待传菜；
   * @param areas 待查询的区域，如果为空或null则不限；
   * @param orderBy 按什么顺序排列，为空则以创建时间为顺序。create：创建时间正序；prepare：配菜时间倒序；passon：传菜时间倒序；
   * @return 不重复的订单ID列表
   */
  List<Long> queryOrderIds(@NotNull Long shopId, Integer status, List<Long> areas, String orderBy);

  /**
   * 对后厨菜品项进行配菜
   * @param kscIdList 待配菜的后厨任务单记录
   */
  @Transactional(rollbackFor = {Exception.class})
  void prepareByList(@NotNull Long operUserId, @NotNull List<Long> kscIdList);

  /**
   * 对后厨菜品项取消配菜
   * @param kscIdList 待取消配菜后厨任务单记录
   */
  @Transactional(rollbackFor = {Exception.class})
  void cancelPreparationByList(@NotNull Long operUserId, @NotNull List<Long> kscIdList);

  /**
   * 对后厨菜品项进行传菜
   * @param kscIdList 待传菜的后厨任务单记录
   */
  @Transactional(rollbackFor = {Exception.class})
  void passonByList(Long operUserId, List<Long> kscIdList);

  /**
   * 对后厨菜品项取消传菜
   * @param kscIdList 待取消传菜的后厨任务单记录
   */
  @Transactional(rollbackFor = {Exception.class})
  void cancelPassonByList(Long operUserId, List<Long> kscIdList);

  List<ProductVo> queryCancelableItems(@NotNull Long shopId, @NotNull Integer status, List<Long> areas);

  /**
   * 获得营业流水下的所有kcKscI列表
   * @param bsId 指定的营业流水
   * @return 营业流水下对应的所有kcKsc列表
   */
  @NotNull
  List<KcKsc> selectByBsId(@NotNull Long bsId);

  /**
   * 获得营业流水列表下的所有kcKscI列表
   * @param bsIds 指定的营业流水id列表
   * @return 营业流水下对应的所有kcKsc列表
   */
  @NotNull
  List<KcKsc> selectByBsIds(@NotNull List<Long> bsIds);

  /**
   * 获得kcKscId列表下的所有kcKscId列表
   * @param kcKscIds 指定的kcKscId列表
   * @return 营业流水下对应的所有kcKsc列表
   */
  @NotNull
  List<KcKsc> selectByKcKscIds(@NotNull List<Long> kcKscIds);

  /**
   * 获得指定营业流失的第一个下单菜品
   * @param bsId 指定的营业流水ID
   * @return 第一个订单后厨记录
   */
  KcKsc getFirstByBsId(@NotNull Long bsId);

  /**
   * 将kcKsc结构转换为 ProductVo 结构
   * @param kcKsc 待转换的 KcKsc 对象
   * @return 转换结果（允许为空，如果 KcKsc实际数量为零，或者其订单为空、桌位为空等则返回null）
   */
  @Nullable
  ProductVo convertToProductVo(@NotNull KcKsc kcKsc);

    List<KcKsc> queryKscSendData(Long bizBsId);

  /**
   * 修改当前菜品订单的时间
   * @param now
   */
  void updateOpenTime(Long bsId);

}
